﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using CDSBDemandControl.Presenter;
using CDSBDemandControl.Model;
using CDSBDemandControl.Configuration;
using System.Web.UI.HtmlControls;

namespace CDSBDemandControl.View.Web.PaginasInternas
{
    public partial class Fabrica : System.Web.UI.Page, IDiscriminatorDemand
    {
        private Presenter.DiscriminatorDemand Presenter;

        protected void Page_Load(object sender, EventArgs e)
        {
            Response.Cache.SetExpires(DateTime.Now.Subtract(new TimeSpan(24, 0, 0)));
            Response.Cache.SetCacheability(HttpCacheability.NoCache);

            if (!this.IsPostBack || this.Session["Presenter"] == null)
            {
                this.Presenter = new DiscriminatorDemand(this);

                this.Session["Presenter"] = this.Presenter;

                if (!this.IsPostBack) this.ListarFaturamento();
            }
            else
            {
                this.Presenter = (Presenter.DiscriminatorDemand)this.Session["Presenter"];
                this.Presenter.ResetView(this);
            }
        }

        private void ListarFaturamento()
        {
            this.ConfigurarFiltros(Filtros.Todos);
            this.Presenter.GenerateRevenue(this.RecuperarFiltroFabrica(), this.RecuperarFiltroProjeto(), this.GetUserRequest());
            this.Presenter.GenerateFactoryWaitingList(this.RecuperarFiltroFabrica(), this.RecuperarFiltroProjeto(), this.GetUserRequest());
            this.Presenter.GeneratefactoryProductionList(this.RecuperarFiltroFabrica(), this.RecuperarFiltroProjeto(), this.GetUserRequest());
        }

        public void ExibirFaturamento(List<BillingModel> billing, bool canSeeBilling)
        {
            this.GridFaturamento.DataSource = billing;
            this.GridFaturamento.DataBind();
            if (canSeeBilling) this.AdicionarAdendosFaturamento(billing);
            this.ConfigurarVisibilidadeFaturamento(canSeeBilling);

            // Exibe a data da última atualização
            (this.Master.FindControl("LblUltimoUpdate") as Label).Text = "Última atualização em: " + this.Presenter.DemandListLastUpdate.ToShortDateString() + " as " + this.Presenter.DemandListLastUpdate.ToShortTimeString();

            (this.Master.FindControl("txtTimeToCompare") as HtmlGenericControl).InnerHtml =
                this.Presenter.DemandListLastUpdate.Year + "," +
                (this.Presenter.DemandListLastUpdate.Month - 1) + "," +
                this.Presenter.DemandListLastUpdate.Day + "," +
                this.Presenter.DemandListLastUpdate.Hour + "," +
                this.Presenter.DemandListLastUpdate.Minute + "," +
                this.Presenter.DemandListLastUpdate.Second;

        }

        public void AdicionarAdendosFaturamento(List<BillingModel> billing)
        {
            string Adendo = ConfigManager.GetPeriodStartDate();

            Adendo = Adendo.ToBrazilianShortDateForUSAShortDate();
            Adendo = Adendo.Substring(Adendo.IndexOf('/') + 1);

            if(this.Presenter.CheckPermission(this.GetUserRequest()))
                this.AdicionarAdendo("*Impostos Inclusos");

            this.AdicionarAdendo(string.Format("Valor a Faturar em {0} {1}", Adendo, String.Format("{0:C}", billing[billing.Count - 1].UsedValue)));

            Adendo = "Somente vêem os dados de faturamento as seguintes pessoas: <br/>Lysias Teixeira<br />Marco Parente<br />Mário Carneiro<br />Marcus Zanini<br />Antonio Lúcio";

            this.AdicionarAdendo(Adendo);
        }

        public void ConfigurarVisibilidadeFaturamento(bool exibirDados)
        {
            this.GridFaturamento.Columns[6].Visible = exibirDados;
            this.GridFaturamento.Columns[7].Visible = exibirDados;
            this.GridFaturamento.Columns[8].Visible = exibirDados;
            this.GridFaturamento.Columns[9].Visible = exibirDados;
            this.GridFaturamento.Rows[this.GridFaturamento.Rows.Count - 1].Cells[this.GridFaturamento.Columns.Count - 1].Controls.Clear();
        }

        private void AdicionarAdendo(string adendo)
        {
            HtmlGenericControl Paragrafo = new HtmlGenericControl("P");

            Paragrafo.InnerHtml = adendo;

            this.divAdendo.Controls.Add(Paragrafo);

            this.divAdendo.Visible = true;
        }

        private string GetUserRequest()
        {
            string User = Request.LogonUserIdentity.Name;

            User = User.Substring((User.LastIndexOf('\\') + 1));

            return User;
        }

        private FiltroProjeto RecuperarFiltroProjeto()
        {
            switch (this.cmbFiltroProjeto.SelectedValue)
            {
                case "SiteBVMF":
                    return FiltroProjeto.SiteBVMF;
                case "Sinacor":
                    return FiltroProjeto.Sinacor;
                case "iMercado":
                    return FiltroProjeto.iMercado;
                default:
                    return FiltroProjeto.Todos;
            }
        }

        private FiltroFabrica RecuperarFiltroFabrica()
        {
            switch (this.CmbFiltroFabrica.SelectedValue)
            {
                case "7COMm":
                    return FiltroFabrica.SevenCOMm;
                case "CDSB":
                    return FiltroFabrica.CDSB;
                default:
                    return FiltroFabrica.Todos;
            }
        }

        private void ConfigurarFiltros(Filtros filtro)
        {
            switch (filtro)
            {
                case Filtros.Fabricas:
                    this.TblFiltro.Visible = true;
                    this.spanFiltroFabrica.Visible = true;
                    this.spanFiltroProjetos.Visible = false;
                    break;
                case Filtros.Projetos:
                    this.TblFiltro.Visible = true;
                    this.spanFiltroFabrica.Visible = false;
                    this.spanFiltroProjetos.Visible = true;
                    break;
                case Filtros.Todos:
                    this.TblFiltro.Visible = true;
                    this.spanFiltroFabrica.Visible = true;
                    this.spanFiltroProjetos.Visible = true;
                    break;
                case Filtros.Nenhum:
                    this.TblFiltro.Visible = false;
                    break;
            }
        }

        protected void Grid_DataBinding(object sender, EventArgs e)
        {
            ((GridView)sender).Visible = true;
        }

        protected void GridFaturamento_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                Decimal aux;
                if ((aux = ((CDSBDemandControl.Model.BillingModel)(e.Row.DataItem)).Deviation) > 0)
                {
                    e.Row.Cells[6].Text = "(-)" + string.Format("{0:C}", aux);
                }

                if (this.Presenter.CheckPermission(this.GetUserRequest()))
                {
                    Int32 hourly;
                    if ((hourly = ((CDSBDemandControl.Model.BillingModel)(e.Row.DataItem)).Hourly) == 50)
                    {
                        //string id = this.GridFaturamento.Rows[this.GridFaturamento.Rows.Count - 1].ID;
                        //if (e.Row.ID != id)
                            e.Row.Cells[9].Text = string.Format("{0:C}", 52.63M) + "*";
                    }
                }
            }

        }

        protected void CmbFiltro_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.ListarFaturamento();
        }

        public void ExibirFactoryWaitingList(List<BillingModel> billing, bool canSeeBilling)
        {
            this.GridFaturamentoAvaliacao.DataSource = billing;
            this.GridFaturamentoAvaliacao.DataBind();            
            this.ConfigurarVisibilidadeWaitingList(canSeeBilling);            
        }

        public void ExibirFactoryProductionList(List<BillingModel> billing, bool canSeeBilling)
        {
            this.GridViewTaskDesenv.DataSource = billing;
            this.GridViewTaskDesenv.DataBind();            
            this.ConfigurarVisibilidadeProductionList(canSeeBilling);            
        }

        private void ConfigurarVisibilidadeProductionList(bool exibirDados)
        {
            this.GridViewTaskDesenv.Columns[6].Visible = exibirDados;
            this.GridViewTaskDesenv.Columns[7].Visible = exibirDados;
            this.GridViewTaskDesenv.Columns[8].Visible = exibirDados;
            this.GridViewTaskDesenv.Columns[9].Visible = exibirDados;
            this.GridViewTaskDesenv.Rows[this.GridViewTaskDesenv.Rows.Count - 1].Cells[this.GridViewTaskDesenv.Columns.Count - 1].Controls.Clear();
        }

        public void ConfigurarVisibilidadeWaitingList(bool exibirDados)
        {
            this.GridFaturamentoAvaliacao.Columns[6].Visible = exibirDados;
            this.GridFaturamentoAvaliacao.Columns[7].Visible = exibirDados;
            this.GridFaturamentoAvaliacao.Columns[8].Visible = exibirDados;
            this.GridFaturamentoAvaliacao.Columns[9].Visible = exibirDados;
            this.GridFaturamentoAvaliacao.Rows[this.GridFaturamentoAvaliacao.Rows.Count - 1].Cells[this.GridFaturamentoAvaliacao.Columns.Count - 1].Controls.Clear();
        }

        #region IDiscriminatorDemand Members

        void IDiscriminatorDemand.ExibirFila(IEnumerable<CDSBDemandControl.Model.DemandModel> demandModels)
        {
            throw new NotImplementedException();
        }

        void IDiscriminatorDemand.ExibirEsteira(IEnumerable<CDSBDemandControl.Model.DemandModel> demandModels)
        {
            throw new NotImplementedException();
        }

        void IDiscriminatorDemand.ExibirRanking(IEnumerable<CDSBDemandControl.Model.DeveloperModel> developers, IEnumerable<CDSBDemandControl.Model.DeveloperModel> leaders, IEnumerable<CDSBDemandControl.Model.DeveloperModel> focalpoints)
        {
            throw new NotImplementedException();
        }

        void IDiscriminatorDemand.ExibirAtrasos(IEnumerable<CDSBDemandControl.Model.DemandModel> PendingDemands, IEnumerable<CDSBDemandControl.Model.DemandModel> Concludeddemands)
        {
            throw new NotImplementedException();
        }        

        void IDiscriminatorDemand.ExibirCodeReview(IEnumerable<CDSBDemandControl.Model.DemandModel> WorkItemsWithCodeReview, IEnumerable<CDSBDemandControl.Model.DemandModel> WorkItemsWithoutCodeReview)
        {
            throw new NotImplementedException();
        }

        void IDiscriminatorDemand.ExibirBugsdeProducao(IEnumerable<CDSBDemandControl.Model.DemandModel> demandModels)
        {
            throw new NotImplementedException();
        }

        void IDiscriminatorDemand.ExibirListaDisp(IEnumerable<CDSBDemandControl.Model.DemandModel> list, IEnumerable<CDSBDemandControl.Model.DeveloperModel> modelAusencias, List<DateTime> fer)
        {
            throw new NotImplementedException();
        }

        void IDiscriminatorDemand.ExibirBugsdeProducaoUltimoMes(List<CDSBDemandControl.Model.DemandModel> BugList)
        {
            throw new NotImplementedException();
        }

        void IDiscriminatorDemand.ExibirAlocacao(IEnumerable<CDSBDemandControl.Model.DemandModel> demandModels)
        {
            throw new NotImplementedException();
        }

        void IDiscriminatorDemand.ExibirSolicitacoesSites(List<CDSBDemandControl.Model.DemandModel> demandModels)
        {
            throw new NotImplementedException();
        }

        void IDiscriminatorDemand.ExibirManagementTeamTasks(List<CDSBDemandControl.Model.DemandModel> demandModels)
        {
            throw new NotImplementedException();
        }

        void IDiscriminatorDemand.ExibirScenariosAndTasks(List<CDSBDemandControl.Model.ScenarioModel> scenarios)
        {
            throw new NotImplementedException();
        }

        #endregion
    }
}
